home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / art&graf.ix / art-3139 / stadconv / fromstad.asm next >
Assembly Source File  |  1987-04-21  |  8KB  |  158 lines

  1. *****************************************************************************
  2. *                                                                           *
  3. * Ass-Unterroutine zum Konvertieren eines gepackten STAD-Bildes in ein 32k  *
  4. * grosses Bild (Screenformat).                                              *
  5. *                                                                           *
  6. * Aufruf:   (sp) LONG  Rücksprungadresse                                    *
  7. *          4(sp) LONG  Adresse des gepackten STAD-Bildes                    *
  8. *          8(sp) LONG  Adresse des Zielbildes (32k Buffer)                  *
  9. * Rückgabe:  d0  0 = Konvertierung erfolgreich                              *
  10. *                1 = Bild ist nicht STAD-gepackt                            *
  11. *                                                                           *
  12. * History:                                                                  *
  13. * Version 1.0   01.06.1991  Wolfgang Ley                                    *
  14. *                           - Urversion                                     *
  15. * Version 1.1   03.06.1991  Wolfgang Ley                                    *
  16. *                           - Rettung der Register eingeführt               *
  17. * Version 1.2   05.06.1991  Wolfgang Ley                                    *
  18. *                           - Extra-Zaehler aus v_lese ausgebaut            *
  19. *                                                                           *
  20. *****************************************************************************
  21.  
  22.                 TEXT
  23.  
  24.                 movem.l D1-D5/A0-A1,-(SP) ;Registerinhalt sichern
  25.  
  26.                 movea.l 32(SP),A0       ;Adresse des gepackten STAD-Bildes
  27.                 movea.l 36(SP),A1       ;Adresse des Zielbildes (32k)
  28.  
  29. ; ---------------------------------------------------------------------------
  30. ; STAD-Header:
  31. ;   Byte 1-4  String 'pM85' (horizontal gepackt)
  32. ;                    'pM86' (vertikal gepackt)
  33. ;   Byte 5    ID-Byte
  34. ;   Byte 6    PACK-Byte
  35. ;   Byte 7    SPECIAL-Byte
  36. ;   ....      Bilddaten
  37. ; ---------------------------------------------------------------------------
  38.  
  39.                 move.b  4(A0),D1        ;ID-Byte lesen
  40.                 move.b  5(A0),D2        ;PACK-Byte lesen
  41.                 move.b  6(A0),D3        ;SPEC-Byte lesen
  42.                 clr.w   D4              ;offset für Zielbild löschen
  43.  
  44.                 cmpi.b  #'p',(A0)+      ;Erstes  Byte = "p"
  45.                 bne.s   fehler
  46.                 cmpi.b  #'M',(A0)+      ;Zweites Byte = "M"
  47.                 bne.s   fehler
  48.                 cmpi.b  #'8',(A0)+      ;Drittes Byte = "8"
  49.                 bne.s   fehler
  50.                 cmpi.b  #'5',(A0)       ;Viertes Byte = "5"
  51.                 beq.s   h_start         ;-> horizontal gepackt
  52.                 cmpi.b  #'6',(A0)       ;Viertes Byte = "6"
  53.                 beq.s   v_start         ;-> vertikal gepackt
  54.  
  55. fehler:         move.l  #1,D0           ;Fehler 1 = kein gepacktes STAD-Bild
  56. exit:           movem.l (SP)+,D1-D5/A0-A1 ;Register wieder herstellen
  57.                 rts
  58.  
  59. ; ---------------------------------------------------------------------------
  60. ; Horizontale Auspack-Routine
  61. ; ---------------------------------------------------------------------------
  62.  
  63. h_start:        addq.l  #4,A0           ;Header ueberspringen
  64. h_lese:         move.b  (A0)+,D0        ;naechstes Byte lesen
  65.                 cmp.b   D1,D0           ;ID-Byte gelesen?
  66.                 beq.s   h_use_pack      ;ja -> use PACK-Byte
  67.                 cmp.b   D3,D0           ;SPEC-Byte gelesen?
  68.                 beq.s   h_use_spec      ;ja -> use SPEC-Byte
  69.                 move.b  D0,0(A1,D4.w)   ;use Byte "as is"
  70.                 addq.w  #1,D4           ;Offset weitersetzen
  71. h_weiter:       cmpi.w  #32000,D4       ;bereits alles gelesen?
  72.                 bne.s   h_lese          ;nein -> weiter lesen
  73.  
  74. fertig:         clr.l   D0              ;Rueckgabewert 0 = alles ok
  75.                 bra.s   exit            ;das war's...
  76.  
  77. ; ---------------------------------------------------------------------------
  78. ; wenn ID-Byte gelesen wurde, so lese weiteres Byte n und benutze PACK-Byte
  79. ; n+1 mal
  80. ; ---------------------------------------------------------------------------
  81.  
  82. h_use_pack:     clr.w   D0              ;erstmal löschen...
  83.                 move.b  (A0)+,D0        ;lese Anzahl
  84. h_pack_1:       move.b  D2,0(A1,D4.w)   ;PACK-Byte schreiben
  85.                 addq.w  #1,D4           ;Offset weitersetzen
  86.                 cmpi.w  #32000,D4       ;bereits fertig?
  87.                 dbeq    D0,h_pack_1     ;und weiter...
  88.                 bra.s   h_weiter        ;naechstes Byte lesen
  89.  
  90. ; ---------------------------------------------------------------------------
  91. ; wenn SPEC-Byte gelesen wurde, so lese zwei weitere Bytes d und n - benutze
  92. ; Byte d n+1 mal
  93. ; ---------------------------------------------------------------------------
  94.  
  95. h_use_spec:     move.b  (A0)+,D5        ;weiteres Byte d lesen
  96.                 clr.w   D0              ;erstmal löschen...
  97.                 move.b  (A0)+,D0        ;Anzahl lesen
  98. h_spec_1:       move.b  D5,0(A1,D4.w)   ;Byte d schreiben
  99.                 addq.w  #1,D4
  100.                 cmpi.w  #32000,D4       ;schon fertig?
  101.                 dbeq    D0,h_spec_1     ;und weiter...
  102.                 bra.s   h_weiter        ;naechstes Byte lesen
  103.  
  104. ; ---------------------------------------------------------------------------
  105. ; Vertikale Auspackroutine
  106. ; ---------------------------------------------------------------------------
  107.  
  108. v_start:        addq.l  #4,A0           ;Header ueberspringen
  109. v_lese:         move.b  (A0)+,D0        ;Byte lesen
  110.                 cmp.b   D1,D0           ;ID-Byte gelesen?
  111.                 beq.s   v_use_pack      ;ja -> use PACK-Byte
  112.                 cmp.b   D3,D0           ;SPEC-Byte gelesen?
  113.                 beq.s   v_use_spec      ;ja -> use SPEC-Byte
  114.                 move.b  D0,0(A1,D4.w)   ;use Byte "as is"
  115.                 addi.l  #80,D4          ;Offset-Zeiger weitersetzen
  116.                 cmpi.w  #32000,D4       ;Zeilenüberlauf?
  117.                 blo.s   v_lese          ;nein, also weiterlesen
  118.                 subi.w  #31999,D4       ;sonst Korrektur
  119.                 cmpi.w  #80,D4          ;schon alles fertig?
  120.                 bne.s   v_lese          ;nein, also weiter
  121.                 bra.s   fertig          ;ja -> fertig
  122.  
  123. ; ---------------------------------------------------------------------------
  124. ; s.o.
  125. ; ---------------------------------------------------------------------------
  126.  
  127. v_use_pack:     clr.w   D0              ;erstmal löschen...
  128.                 move.b  (A0)+,D0        ;Anzahl lesen
  129. v_pack_1:       move.b  D2,0(A1,D4.w)   ;PACK-Byte schreiben
  130.                 addi.l  #80,D4          ;Offset weitersetzen
  131.                 cmpi.w  #32000,D4       ;Zeilenüberlauf?
  132.                 blo.s   v_pack_2        ;nein, alles klaro
  133.                 subi.w  #31999,D4       ;sonst Korrektur
  134.                 cmpi.w  #80,D4          ;schon alle Spalten voll?
  135.                 beq.s   fertig          ;ja, also Abbruch
  136. v_pack_2:       dbra    D0,v_pack_1     ;evtl. weiterschreiben...
  137.                 bra.s   v_lese          ;und naechstes Byte...
  138.  
  139. ; ---------------------------------------------------------------------------
  140. ; s.o.
  141. ; ---------------------------------------------------------------------------
  142.  
  143. v_use_spec:     move.b  (A0)+,D0        ;weiteres Byte d lesen
  144.                 clr.w   D7              ;erst löschen,
  145.                 move.b  (A0)+,D7        ;dann Anzahl lesen
  146. v_spec_1:       move.b  D0,0(A1,D4.w)   ;Byte d schreiben
  147.                 addi.l  #80,D4          ;Offset weitersetzen
  148.                 cmpi.w  #32000,D4       ;Zeilenüberlauf?
  149.                 blo.s   v_spec_2        ;nein, also weiter
  150.                 subi.w  #31999,D4       ;sonst Offsetkorrektur
  151.                 cmpi.w  #80,D4          ;schon letzte Spalte fertig?
  152.                 beq     fertig          ;ja, also Abbruch
  153. v_spec_2:       dbra    D7,v_spec_1     ;und weiter geht's
  154.                 bra.s   v_lese          ;und naechstes Byte...
  155.  
  156.  
  157.                 END
  158.